﻿namespace OneWorks.Utils.AdoNet
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;

    /// <summary>
    /// 数据操作接口
    /// </summary>
    public interface IDbUtility
    {
        /// <summary>
        /// 数据库连接字符串
        /// </summary>
        string GetConnectionString();

        /// <summary>
        /// 获取数据库类型
        /// </summary>
        /// <returns></returns>
        DbProviderType GetDbType();

        /// <summary>      
        /// 对数据库执行增删改操作，返回受影响的行数。      
        /// </summary>      
        /// <param name="sql">要执行的增删改的SQL语句</param>      
        /// <returns></returns>     
        int ExecuteNonQuery(string sql);

        /// <summary>      
        /// 对数据库执行增删改操作，返回受影响的行数。      
        /// </summary>      
        /// <param name="sql">要执行的增删改的SQL语句</param>      
        /// <param name="parameters">执行增删改语句所需要的参数</param>   
        /// <returns></returns>     
        int ExecuteNonQuery(string sql, IList<DbParameter> parameters);

        /// <summary>      
        /// 对数据库执行增删改操作，返回受影响的行数。      
        /// </summary>      
        /// <param name="sql">要执行的增删改的SQL语句</param>      
        /// <param name="parameters">执行增删改语句所需要的参数</param>   
        /// <param name="commandType">执行的SQL语句的类型</param>   
        /// <returns></returns>   
        int ExecuteNonQuery(string sql, IList<DbParameter> parameters, CommandType commandType);

        /// <summary>      
        /// 执行一个查询语句，返回一个关联的DataReader实例      
        /// </summary>      
        /// <param name="sql">要执行的查询语句</param>      
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>   
        /// <returns></returns>    
        DbDataReader ExecuteReader(string sql, IList<DbParameter> parameters);


        /// <summary>      
        /// 执行一个查询语句，返回一个关联的DataReader实例      
        /// </summary>      
        /// <param name="sql">要执行的查询语句</param>      
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>   
        /// <param name="commandType">执行的SQL语句的类型</param>   
        /// <returns></returns>    
        DbDataReader ExecuteReader(string sql, IList<DbParameter> parameters, CommandType commandType);


        /// <summary>      
        /// 执行一个查询语句，返回一个包含查询结果的DataTable      
        /// </summary>      
        /// <param name="sql">要执行的查询语句</param>      
        /// <returns></returns>   
        DataTable ExecuteDataTable(string sql);


        /// <summary>      
        /// 执行一个查询语句，返回一个包含查询结果的DataTable      
        /// </summary>      
        /// <param name="sql">要执行的查询语句</param>      
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>   
        /// <returns></returns>   
        DataTable ExecuteDataTable(string sql, IList<DbParameter> parameters);


        /// <summary>      
        /// 执行一个查询语句，返回一个包含查询结果的DataTable      
        /// </summary>      
        /// <param name="sql">要执行的查询语句</param>      
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>   
        /// <param name="commandType">执行的SQL语句的类型</param>   
        /// <returns></returns>   
        DataTable ExecuteDataTable(string sql, IList<DbParameter> parameters, CommandType commandType);


        /// <summary>      
        /// 执行一个查询语句，返回一个包含查询结果的DataTable      
        /// </summary>      
        /// <param name="sql">要执行的查询语句</param>      
        /// <returns></returns>   
        DataSet ExecuteDataSet(string sql);


        /// <summary>      
        /// 执行一个查询语句，返回一个包含查询结果的DataTable      
        /// </summary>      
        /// <param name="sql">要执行的查询语句</param>      
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>   
        /// <returns></returns>   
        DataSet ExecuteDataSet(string sql, IList<DbParameter> parameters);


        /// <summary>      
        /// 执行一个查询语句，返回一个包含查询结果的DataTable      
        /// </summary>      
        /// <param name="sql">要执行的查询语句</param>      
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>   
        /// <param name="commandType">执行的SQL语句的类型</param>   
        /// <returns></returns>   
        DataSet ExecuteDataSet(string sql, IList<DbParameter> parameters, CommandType commandType);


        /// <summary>      
        /// 执行一个查询语句，返回查询结果的第一行第一列      
        /// </summary>      
        /// <param name="sql">要执行的查询语句</param>      
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>      
        /// <returns></returns>      
        Object ExecuteScalar(string sql, IList<DbParameter> parameters);


        /// <summary>      
        /// 执行一个查询语句，返回查询结果的第一行第一列      
        /// </summary>      
        /// <param name="sql">要执行的查询语句</param>      
        /// <param name="parameters">执行SQL查询语句所需要的参数</param>      
        /// <param name="commandType">执行的SQL语句的类型</param>   
        /// <returns></returns>      
        Object ExecuteScalar(string sql, IList<DbParameter> parameters, CommandType commandType);

        /// <summary>
        /// 创建参数
        /// </summary>
        /// <param name="name"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        DbParameter CreateDbParameter(string name, object value);

        /// <summary>
        /// 创建参数
        /// </summary>
        /// <param name="name"></param>
        /// <param name="parameterDirection"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        DbParameter CreateDbParameter(string name, ParameterDirection parameterDirection, object value);

    }
}
